package com.weipt.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
 * @author weipt
 * @description 测试消息过期进入死信队列
 * 注意，进入死信队列的三个条件
 * 1、消息过期
 * 2、队列长度不够
 * 3、消息拒绝
 * @date 2024/1/16 22:23
 */
@Configuration
public class TestTtlFanoutQueueConfig {

    @Bean
    public FanoutExchange testTtlExchange(){
        return new FanoutExchange("fanout-test-ttl-exchange-springboot", true, false);
    }

    /**
     *
     * String name,
     * boolean durable,
     * boolean exclusive,
     * boolean autoDelete,
     * @Nullable Map<String, Object> arguments
     */
    @Bean
    public Queue testTtlQueue(){
        Map<String, Object> argsMap = new HashMap<>();
        //rabbit管理平台，可以在queues界面，有个arguments参数，下面可以有你想要的内容
        //不过这个我觉得要是做的好，可以支持传入一个bean对象进来
        //当我们我们自己可以定义一个bean，然后加上@JsonPropertis等注解，然后利用beanToMap转换
        argsMap.put("x-message-ttl", 5000); //ms
        argsMap.put("x-dead-letter-exchange", "fanout-dead-exchange-springboot"); //死信队列交换机
        //argsMap.put("x-dead-letter-routing-key", ""); //fanout没有路由key，此处不需要
        return new Queue("test-ttl-queue", true, false,false, argsMap);
    }

    @Bean
    public Binding testTtlBinding(){
        return BindingBuilder.bind(testTtlQueue()).to(testTtlExchange());
    }


}
